import os
from dotenv import load_dotenv
from typing import Optional
import logging

logger = logging.getLogger(__name__)

class AppConfig:
    """应用配置管理"""
    
    def __init__(self):
        """初始化配置"""
        # 加载.env文件
        load_dotenv('.env')
        
        # OpenAI配置
        self.openai_api_key = self._get_config('OPENAI_API_KEY')
        
        # 数据分析配置
        self.default_query = self._get_config('DEFAULT_QUERY', 
                                            default="artificial intelligence")
        self.max_results = int(self._get_config('MAX_RESULTS', default=50))
        self.time_window = self._get_config('TIME_WINDOW', default="month")
        
        # API服务配置
        self.api_host = self._get_config('API_HOST', default="0.0.0.0")
        self.api_port = int(self._get_config('API_PORT', default=8000))
        
        # 日志配置
        self.log_level = self._get_config('LOG_LEVEL', default="INFO")
        self.log_file = self._get_config('LOG_FILE', default="tech_trend.log")
        
        # 向量数据库配置
        self.vector_db_dir = self._get_config('VECTOR_DB_DIR', 
                                            default="chroma_db")

    def _get_config(self, key: str, default: Optional[str] = None) -> str:
        """获取配置项
        
        Args:
            key: 配置键
            default: 默认值
            
        Returns:
            配置值
            
        Raises:
            ValueError: 当必需配置缺失时
        """
        value = os.getenv(key, default)
        
        if value is None:
            raise ValueError(f"必需配置缺失: {key}")
            
        # 安全日志记录 - 不记录敏感信息
        if 'API_KEY' in key:
            logger.debug(f"加载配置 {key}=[REDACTED]")
        else:
            logger.debug(f"加载配置 {key}={value}")
            
        return value

    def validate(self) -> bool:
        """验证配置有效性
        
        Returns:
            配置是否有效
        """
        try:
            # 验证OpenAI配置
            if not self.openai_api_key or len(self.openai_api_key) < 20:
                raise ValueError("无效的OpenAI API密钥")
                
            # 验证数值范围
            if not (1 <= self.max_results <= 1000):
                raise ValueError("MAX_RESULTS必须在1-1000之间")
                
            if not (1024 <= self.api_port <= 65535):
                raise ValueError("API_PORT必须在1024-65535之间")
                
            # 验证时间窗口
            if self.time_window not in ['day', 'week', 'month', 'year']:
                raise ValueError("无效的TIME_WINDOW值")
                
            return True
            
        except Exception as e:
            logger.error(f"配置验证失败: {str(e)}")
            return False